home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (PO) / Nibble Volume 11, No. 03 (1990-03)(MindCraft Publishing)(Side A).zip / Nibble Volume 11, No. 03 (1990-03)(MindCraft Publishing)(Side A).po / DISK.DOCTOR.S < prev    next >
Text File  |  1996-12-24  |  45KB  |  1,420 lines

  1. *****************************************
  2. *                                       *
  3. * DISK.DOCTOR SOURCE CODE               *
  4. * BY MICHAEL E. ANDERSON                *
  5. * COPYRIGHT(C) 1990                     *
  6. * MINDCRAFT PUBL. CORP.                 *
  7. * CONCORD, MA 01742                     *
  8. *                                       *
  9. *****************************************
  10. *                                       *
  11. *          MERLIN ASSEMBLER             *
  12. *                                       *
  13. *****************************************
  14.  
  15.           ORG $A10       ;origin
  16.  
  17.           JMP START      ;program entry point
  18.  
  19. * Global Equates ---------------------------------------*
  20.  
  21. RIGHT     EQU $21        ;right margin
  22. TOP       EQU $22        ;top margin
  23. BOTTOM    EQU $23        ;bottom margin
  24. HORIZ     EQU $24        ;horizontal tab
  25. VERT      EQU $25        ;vertical tab
  26. CSWL      EQU $36        ;output hook low order byte
  27. CSWH      EQU $37        ;output hook high order byte
  28. KSWL      EQU $38        ;input hook low order byte
  29. KSWH      EQU $39        ;input hook high order byte
  30.  
  31. HOME      EQU $FC58      ;home cursor & clear screen
  32. PHEX      EQU $FDDA      ;entry pnt output hex char
  33. PCHAR     EQU $FDED      ;entry pnt output ASCII char
  34. READ1     EQU $FD0C      ;keyin reads key from keyboard
  35. MLI       EQU $BF00      ;MLI entry point
  36. BASIC     EQU $03D0      ;basic entry point
  37. TAB       EQU $FC22      ;tabbing entry point
  38. CLEOL     EQU $FC9C      ;clear to end of line
  39. OUTPORT   EQU $FE95      ;reset outport hooks
  40. BBUFF     EQU $0800      ;page 1 buffer
  41. BBUFF2    EQU $0900      ;page 2 buffer
  42.  
  43. * Strings ----------------------------------------------*
  44.  
  45. STR1      ASC '   PRODOS DISK DOCTOR BY MICHAEL E. ANDERSON '
  46. TAG       ASC '(C) 1990 MINDCRAFT PUBL. CORP.    ',8D
  47.           ASC "         [N],[W],[C],[E],[L],[P],[R],"
  48.           ASC "[Q],[A]ssist -- ENTER COMMAND :",00
  49. STR2      ASC "ASCII-EQUIV. "
  50. STR2A     ASC "BLOCK",3D
  51.           DB $00
  52. STR3      ASC "Enter Drive (1 or 2)________________$",00
  53.           ASC "Enter Slot  (1 -- 7)________________$",00
  54.           ASC "Enter Base Block ($0000 thru $FFFF)_$",00
  55. ERR_MSG1  DDB $8D8D
  56.           ASC "I/O ERROR",00
  57. ERR_MSG2  DDB $8D8D
  58.           ASC "NO DEVICE CONNECTED",00
  59. TRY_MSG   DDB $8D8D
  60.           ASC "TRY AGAIN (Y or N):",00
  61. VMSG1     ASC "VERIFY WRITE (Y or N):",00
  62. ED_MSG1   ASC "[A]SCII or [H]EX :"
  63. BLK_MSG   ASC "BLOCK"
  64. HLP_MSG   DB $8D
  65.           ASC "[N]ext Block ------------ Retrieves the "
  66.           ASC "next block from disk",8D
  67.           ASC "[W]rite Block ----------- Writes the cur"
  68.           ASC "rent block to disk",8D
  69.           ASC "[C]hange Page ----------- Displays the "
  70.           ASC "opposite half of the current block",8D
  71.           DB $00
  72. HLP_MSG1  ASC "[E]dit ------------------ Allows editing "
  73.           ASC "current block in AS"
  74.           ASC "CII or HEX",8D
  75.           ASC "[L]ast Block ------------ Retrieves the "
  76.           ASC "previous block from disk",8D
  77.           ASC "[P]rint Block ----------- Prints the "
  78.           ASC "current block to the Printer (slot 1)",8D
  79.           DB $00
  80. HLP_MSG2  ASC "[R]eset Base ------------ Allows you to "
  81.           ASC "retrieve a block at random",8D
  82.           ASC "[Q]uit ------------------ Exits the prog"
  83.           ASC "ram",8D
  84.           ASC "[A]ssist ---------------- Displays this"
  85.           ASC " screen",8D
  86.           ASC "<ESC>________ Exits Current Prompt retur"
  87.           ASC "ns to command line",8D
  88.           DB $00
  89. HLP_MSG3  ASC "<SPC>________ Changes High Low Nibble by"
  90.           ASC "te position in EDIT Mode",8D
  91.           ASC "<ARROW'S>____ Moves Cursor within HEX or"
  92.           ASC " ASCII grid during EDIT",8D
  93.           DB $8D
  94.           ASC "                          PRESS ANY KEY:"
  95.           DB $00
  96. QT_MSG    ASC "Exit Program (Y or N) :",00
  97. PG_MSG    ASC "Page"
  98. PRNT_MSG  ASC "Printer Ready (Y or N):"
  99.  
  100.  
  101. * Temp Storage -----------------------------------------*
  102.  
  103.  
  104. NUM       DB $00         ;count byte for LINE routine
  105. PNTR1     DB $00         ;temp char pointer
  106. PNTR2     DB $00         ;temp counter
  107. TEMPA     DB $00         ;temp 'A' reg.
  108. TEMPA2    DB $00         ;secondary temp 'A' reg.
  109. TEMPY     DB $00         ;temp 'Y' reg.
  110. FIRST     DB $00         ;high nibble of high order word
  111. SECOND    DB $00         ;low nibble of high order word
  112. THIRD     DB $00         ;high nibble of low order word
  113. FOURTH    DB $00         ;low nibble of low order word
  114. PAGE      DB $00         ;page index
  115. BPNTR     DB $00         ;base pointer line
  116. EBASE     DB $00         ;16 bytes per count
  117. CUR_BYTE  DB $00         ;current byte pos.(htab)
  118. BYTE_POS  DB $00         ;nibble index
  119. CUR_LINE  DB $00         ;line of bytes (vtab)
  120. BYTE_NO   DB $00         ;buffer index
  121. TMP_BYTE  DB $00         ;temp byte storage
  122. HEX_POS   DB $00         ;current hex grid position
  123. ASK_POS   DB $00         ;current ascii grid position
  124. CSWLS     DB $00         ;output hooks temp
  125. CSWHS     DB $00
  126. KSWLS     DB $00         ;input hooks temp
  127. KSWHS     DB $00
  128. PAGE_TMP  DB $00         ;temp page index
  129.  
  130.  
  131. * File Control Block -----------------------------------*
  132.  
  133. FCB       DB $03         ;parameter count
  134. DEV_NUM   DB $00         ;device number
  135.           DA BBUFF       ;buffer addr.
  136. BLK_LOW   DB $00         ;block number low byte
  137. BLK_HIGH  DB $00         ;block number high byte
  138.  
  139. * Program Entry Point ----------------------------------*
  140.  
  141. START     JSR SCREEN     ;set up main screen
  142.           JSR DEVICE     ;get device information
  143.           JSR DISP_BLK   ;display block
  144.  
  145.           JMP COM_LINE   ;command line entry
  146.  
  147. * Screen Format Routine --------------------------------*
  148.  
  149.  
  150. SCREEN    LDA #$03       ;slot #
  151.           JSR $FE95      ;set I/O hooks for 80 col.
  152.  
  153.  
  154. ST        LDA #$00
  155.           STA TOP        ;set top margin
  156.           STA VERT       ;set vert.tab var.
  157.           JSR HOME       ;clear screen
  158.           LDA #$00
  159.           STA HORIZ      ;set horiz.tab var.
  160.           JSR TAB        ;pos. using vert & horiz
  161.  
  162.           LDY #00        ;set base pntr
  163. LOOP1     LDA STR1,Y     ;string
  164.           CMP #00        ;string terminate
  165.           BEQ NXT1
  166.           JSR PCHAR      ;char.output
  167.           INY            ;bump pntr.
  168.           JMP LOOP1      ;get next char.
  169.  
  170. NXT1      LDA #$8D       ;crlf.
  171.           JSR PCHAR      ;char.output
  172.           JSR PCHAR
  173.  
  174.           LDY #00        ;set base pntr.
  175. PG1       LDA PG_MSG,Y   ;string
  176.           JSR PCHAR      ;char.output
  177.           CPY #$03       ;string terminate
  178.           BEQ PG2
  179.           INY            ;bump pntr.
  180.           JMP PG1        ;get next char.
  181.  
  182. PG2       LDA #$3D       ;'='
  183.           JSR PCHAR      ;char.output
  184.  
  185.           LDX #$00       ;char.for indx.header
  186. LOOP3     LDA #$FC       ;"|"
  187.           JSR PCHAR      ;char.output
  188.           TXA            ;get indx.
  189.           JSR PHEX       ;hex.output
  190.           INX            ;bump indx.
  191.           CPX #$10
  192.           BEQ NXT3       ;end of routine
  193.           JMP LOOP3      ;print next indx.
  194.  
  195. NXT3      LDA #$FC       ;"|"
  196.           JSR PCHAR      ;char.output
  197.           LDA #$05       ;#of'='s for line
  198.           STA NUM
  199.           JSR LINE       ;print line (======)
  200.  
  201.           LDY #00        ;set base pntr.
  202. LOOP5     LDA STR2,Y     ;string
  203.           CMP #$A0       ;string terminate
  204.           BEQ NXT5
  205.           JSR PCHAR      ;char.output
  206.           INY            ;bump pntr.
  207.           JMP LOOP5      ;get next char.
  208.  
  209. NXT5      LDA #$03       ;#of'='s for line
  210.           STA NUM
  211.           JSR LINE       ;print line (======)
  212.  
  213.           LDY #$00       ;set base pntr.
  214. LOOP6     LDA STR2A,Y    ;string
  215.           CMP #$00       ;string terminate
  216.           BEQ NXT5A
  217.           JSR PCHAR      ;char.output
  218.           INY            ;bump pntr.
  219.           JMP LOOP6      ;get next char.
  220.  
  221. NXT5A     LDA #$50       ;#of'='s for line
  222.           STA NUM
  223.           JSR LINE       ;print line (======)
  224.  
  225.           LDA #$05
  226.           STA TOP        ;set top margin
  227.           LDA #$15
  228.           STA VERT       ;set vert.tab var.
  229.           LDA #$00
  230.           STA HORIZ      ;set horiz.tab var
  231.           JSR TAB        ;pos.using vert.& horiz.
  232.           LDA #$50       ;#of'='s for line
  233.           STA NUM
  234.           JSR LINE       ;print line (======)
  235.  
  236.           LDA #$15
  237.           STA BOTTOM     ;set bot.margin
  238.  
  239.           RTS            ;return to caller
  240.  
  241. * Window Definition ------------------------------------*
  242.  
  243. WIND      LDA #$06
  244.           STA VERT       ;set vert.tab var.
  245.           STA HORIZ      ;set horiz.tab var.
  246.           JSR TAB        ;pos.using vert.& horiz.
  247.  
  248.           LDA #$05
  249.           STA TOP        ;set top.margin
  250.           LDA #$15
  251.           STA BOTTOM     ;set bot.margin
  252.           LDA #$4B
  253.           STA RIGHT      ;set right margin
  254.           RTS            ;return to caller
  255.  
  256. * Set Prompts For Device Info --------------------------*
  257.  
  258. * All reg.'s at this point are free --------------------*
  259.  
  260. DEVICE    JSR WIND       ;pos.curs.set wnd.
  261.  
  262.           LDX #$00       ;set base pntr.
  263.           LDA #$00       ;null pntrs.
  264. D0        STA PNTR1,X    ;pntr.bufr.
  265.           CPX #$10
  266.           BEQ DEV        ;get dev.info.
  267.           INX            ;bump pntr.
  268.           JMP D0         ;null next pntr.
  269.  
  270. DEV       JSR HOME       ;clear screen
  271. D1        LDA #$8D       ;crlf.
  272.           JSR PCHAR      ;char.output
  273.           LDY PNTR1      ;prompt flag
  274.  
  275. D2        LDA STR3,Y     ;string
  276.           INY            ;bump pntr
  277.           CMP #$00       ;char.terminate
  278.           BEQ GETIN
  279.           JSR PCHAR      ;char.output
  280.           JMP D2         ;get next char.
  281.  
  282. GETIN     STY PNTR1      ;store prompt flag
  283.           LDY PNTR2      ;loop cntr.
  284.           INY
  285.           STY PNTR2      ;save loop cntr.
  286.           JSR INPUT1
  287.           LDY PNTR2      ;loop cntr.
  288.           CPY #$03       ;chk for 3 times thru loop
  289.           BEQ NXT6
  290.           JMP D1
  291.  
  292. NXT6      CLC            ;carry used for error chk
  293.           LDA #$80       ;read_block param.
  294.           STA R_W        ;read/write byte
  295.  
  296.           JMP MLI_E      ;MLI entry point
  297.  
  298. * Command Line -----------------------------------------*
  299.  
  300. COM_LINE  LDA #$44
  301.           STA HORIZ      ;horiz.tab var.
  302.           LDA #$01
  303.           STA VERT       ;vert.tab var.
  304.           JSR TAB        ;pos.using vert.& horiz.
  305.  
  306.           JSR READ1      ;read keyboard
  307.           JSR PROCOM     ;process command
  308.           JMP COM_LINE   ;return to command line
  309.  
  310. * Process Command --------------------------------------*
  311.  
  312. PROCOM    CMP #$8E       ;cntrl-N
  313.           BEQ NBLK
  314.           CMP #$91       ;cntrl-Q
  315.           BEQ QBLK
  316.           CMP #$83       ;cntrl-C
  317.           BEQ CP
  318.           CMP #$8C       ;cntrl-L
  319.           BEQ LBLK
  320.           CMP #$92       ;cntrl-R
  321.           BEQ RBASE
  322.           CMP #$97       ;cntrl-W
  323.           BEQ WRTE
  324.           CMP #$90       ;cntrl-P
  325.           BEQ PRNT
  326.           CMP #$85       ;cntrl-E
  327.           BEQ EDIT
  328.           CMP #$81       ;cntrl-A
  329.           BEQ HLP
  330.  
  331.           RTS            ;return to command line
  332.  
  333. NBLK      JSR NBLKA      ;get next block
  334.           RTS            ;return to command line
  335. QBLK      JSR QT         ;exit program enter basic
  336.           RTS
  337. CP        JSR CHPAGE     ;change page
  338.           RTS            ;return to command line
  339. LBLK      JSR LSTBLK     ;get previous block
  340.           RTS            ;return to command line
  341. RBASE     JSR RBAS       ;reset the base block
  342.           RTS            ;return to command line
  343. WRTE      JSR RITE       ;setup for write block
  344.           RTS            ;return to command line
  345. PRNT      JSR PRNTT      ;go print block
  346.           RTS            ;return to command line
  347. EDIT      JSR EDIT1A     ;edit current block
  348.           RTS            ;return to command line
  349. HLP       JSR HELP       ;display help screen
  350.           RTS            ;return to command line
  351.  
  352. * Help Screen ------------------------------------------*
  353.  
  354. HELP      JSR WIND       ;pos.curs. set wndw.
  355.           JSR HOME       ;clear screen
  356.  
  357.           LDX #$00       ;set base pntr.
  358. HLP1      LDA HLP_MSG,X  ;string
  359.           CMP #$00       ;sting terminate
  360.           BEQ HLP2
  361.           INX            ;bump pntr.
  362.           JSR PCHAR      ;char.output
  363.           JMP HLP1       ;get next char.
  364.  
  365. HLP2      LDX #$00       ;set base pntr.
  366. HLP3      LDA HLP_MSG1,X ;string
  367.           CMP #$00       ;string terminate
  368.           BEQ HLP4
  369.           INX            ;bump pntr.
  370.           JSR PCHAR      ;char.output
  371.           JMP HLP3       ;get next char.
  372.  
  373. HLP4      LDX #$00       ;set base pntr.
  374. HLP5      LDA HLP_MSG2,X ;string
  375.           CMP #$00       ;string terminate
  376.           BEQ HLP6
  377.           INX            ;bump pntr.
  378.           JSR PCHAR      ;char.output
  379.           JMP HLP5       ;get next char.
  380.  
  381. HLP6      LDX #$00       ;set base pntr.
  382. HLP6A     LDA HLP_MSG3,X ;string
  383.           CMP #$00       ;string terminate
  384.           BEQ HLP7
  385.           INX            ;bump pntr.
  386.           JSR PCHAR      ;char.output
  387.           JMP HLP6A      ;get next char.
  388.  
  389. HLP7      JSR READ1      ;read keyboard
  390.           JSR DISP_BLK   ;refreash the screen
  391.           RTS            ;return to caller
  392.  
  393. * Edit ASCII or HEX ------------------------------------*
  394.  
  395. EDIT1A    LDA #$16
  396.           STA VERT       ;set vert.tab var.
  397.           LDA #$1E
  398.           STA HORIZ      ;set horiz.tab var.
  399.           JSR TAB        ;pos.using vet.& horiz.
  400.  
  401.           LDX #$00       ;set base pntr.
  402. ED        LDA ED_MSG1,X  ;string
  403.           JSR PCHAR      ;char.output
  404.           CPX #$11       ;string terminate
  405.           BEQ ED1
  406.           INX            ;bump pntr.
  407.           JMP ED         ;get next char.
  408.  
  409. ED1       JSR READ1      ;read keyboard
  410.           CMP #$9B       ;ESC
  411.           BEQ ED2
  412.           AND #$DF       ;mask to upper case
  413.           CMP #$C1       ;'A'scii
  414.           BEQ ED3
  415.           CMP #$C8       ;'H'ex
  416.           BEQ ED4
  417.           JMP ED1        ;get another key
  418.  
  419. ED2       JSR CLR1       ;clear message line
  420.           RTS            ;return to command line
  421. ED3       JSR CLR1       ;clear message line
  422.           JSR ASKEY      ;enter askey edit module
  423.           RTS            ;return to command line
  424. ED4       JSR CLR1       ;clear message line
  425.           JSR EDIT1      ;enter hex edit module
  426.           RTS            ;return to command line
  427.  
  428. * Right Arrow for ASCII Routine ------------------------*
  429.  
  430. RAW       LDX CUR_BYTE   ;current htab
  431.           CPX #$48       ;end of line
  432.           BEQ RAW1
  433.           INC CUR_BYTE   ;vtab by one
  434.           INC HEX_POS    ;htab_pos for hex grid
  435.           INC HEX_POS    ;bump it by three
  436.           INC HEX_POS
  437.           INC BYTE_NO    ;bump index by one
  438.           JSR UPD_POS    ;update cursor position
  439.           RTS            ;return to caller
  440.  
  441. RAW1      LDX #$39       ;reset to begin line
  442.           STX CUR_BYTE   ;current htab
  443.           LDA BYTE_NO    ;bufr.index
  444.           SEC
  445.           SBC #$0F
  446.           STA BYTE_NO    ;bufr.index
  447.           LDA #$06       ;reset tab loc. for hex grid
  448.           STA HEX_POS    ;hex grid index
  449.           JSR UPD_POS    ;update cursor position
  450.           RTS            ;return to caller
  451.  
  452. * Left Arrow for ASCII Routine -------------------------*
  453.  
  454. LAW       LDX CUR_BYTE   ;current htab
  455.           CPX #$39       ;ascii grid line begin
  456.           BEQ LAW1
  457.           DEC CUR_BYTE
  458.           DEC HEX_POS    ;decrement hex grid index
  459.           DEC HEX_POS    ;by three
  460.           DEC HEX_POS
  461.           DEC BYTE_NO    ;bufr.index
  462.           JSR UPD_POS    ;update cursor position
  463.           RTS            ;return to caller
  464.  
  465. LAW1      LDX #$48
  466.           STX CUR_BYTE   ;update current htab
  467.           LDA BYTE_NO    ;bufr.index
  468.           CLC
  469.           ADC #$0F
  470.           STA BYTE_NO    ;bufr.index
  471.           LDA #$33       ;EOL hex grid
  472.           STA HEX_POS    ;hex grid index
  473.           JSR UPD_POS    ;update cursor position
  474.           RTS            ;return to caller
  475.  
  476. * ASCII Filter -----------------------------------------*
  477.  
  478. ASKEY1    CMP #$8D       ;crlf
  479.           BEQ ASKEY2
  480.           CMP #$A0       ;bottom limit of ascii range
  481.           BCC ASKEY2
  482.           CMP #$FF       ;outer limit of ascii range
  483.           BCS ASKEY2
  484.  
  485.           STA TMP_BYTE   ;store 'A' reg.
  486.           JSR PCHAR      ;char.ouput
  487.           LDA CUR_BYTE   ;get current htab
  488.           STA ASK_POS    ;ASCII grid index
  489.           LDA HEX_POS    ;HEX grid index
  490.           STA CUR_BYTE   ;set current htab
  491.           JSR UPD_POS    ;update cursor
  492.           LDA TMP_BYTE   ;restore 'A' reg.
  493.           AND #$7F       ;set to low Ascii
  494.  
  495.           JSR PHEX       ;refresh hex grid
  496.           LDA ASK_POS    ;ASCII grid index
  497.           STA CUR_BYTE   ;set current htab
  498.           JSR UPD_POS    ;update cursor
  499.           LDA PAGE       ;get page index
  500.           CMP #$00       ;is it page 1
  501.           BEQ ASKEY3
  502.           LDA TMP_BYTE   ;get original val of entry
  503.           AND #$7F       ;set to low ascii
  504.           LDX BYTE_NO    ;get buffer index
  505.           STA BBUFF2,X   ;store new byte val
  506. ASKEY2    RTS            ;return to caller
  507.  
  508. ASKEY3    LDA TMP_BYTE   ;get original entry
  509.           AND #$7F       ;set to low ascii
  510.           LDX BYTE_NO    ;get buffer index
  511.           STA BBUFF,X    ;store new byte val
  512.           RTS            ;return to caller
  513.  
  514. * ASCII Entry Module -----------------------------------*
  515.  
  516. ASKEY     LDA #$39       ;byte 0 ascii grid
  517.           STA CUR_BYTE   ;current htab
  518.           LDA #$06       ;htab for hex grid
  519.           STA HEX_POS    ;store htab loc.for hex grid
  520.           LDA #$05
  521.           STA CUR_LINE   ;current vtab
  522.           LDA #$00       ;set base index
  523.           STA BYTE_NO    ;bufr.index
  524.           JSR UPD_POS    ;update curs.
  525.  
  526. ASK1      JSR READ1      ;read keyboard
  527.           CMP #$9B       ;ESC
  528.           BEQ ASK2
  529.           CMP #$81       ;Cntrl-H
  530.           BEQ ASKHLP
  531.           CMP #$95       ;right arrow
  532.           BEQ ASK3
  533.           CMP #$88       ;left arrow
  534.           BEQ ASK4
  535.           CMP #$8B       ;up arrow
  536.           BEQ ASK5
  537.           CMP #$8A       ;down arrow
  538.           BEQ ASK6
  539.           JSR ASKEY1     ;validate ascii range
  540.           JMP ASK1       ;loop get a key
  541.  
  542. ASK2      RTS            ;return to caller
  543.  
  544. ASK3      JSR RAW        ;right arrow key was pressed
  545.           JMP ASK1       ;get a key upon return
  546. ASK4      JSR LAW        ;left arrow key was pressed
  547.           JMP ASK1       ;get a key upon return
  548. ASK5      JSR UPARROW    ;up arrow key was pressed
  549.           JMP ASK1       ;get a key upon return
  550. ASK6      JSR DNARROW    ;down arrow key was pressed
  551.           JMP ASK1       ;get a key upon return
  552. ASKHLP    JSR HELP       ;go display help screen
  553.           JSR UPD_POS    ;update curs.pos.
  554.           JMP ASK1       ;loop get a key
  555.  
  556. * Edit Current Block -----------------------------------*
  557.  
  558. EDIT1     LDA #$05
  559.           STA CUR_LINE   ;set current vtab
  560.           LDA #$06       ;htab for position 0
  561.           STA CUR_BYTE   ;set current htab
  562.           LDA #$39       ;set ascii grid loc 0
  563.           STA ASK_POS    ;ascii grid index
  564.           LDA #$00
  565.           STA BYTE_POS   ;nibble index
  566.           STA BYTE_NO    ;bufr.index
  567.           JSR UPD_POS    ;update curs.pos.
  568.  
  569. EDIT2     JSR READ1      ;read keyboard
  570.           CMP #$9B       ;ESC
  571.           BEQ ESC1
  572.           CMP #$81       ;Cntrl-A
  573.           BEQ EDHLP
  574.           CMP #$A0       ;space bar
  575.           BEQ SPCBA
  576.           CMP #$95       ;right arrow
  577.           BEQ RAROW
  578.           CMP #$88       ;left arrow
  579.           BEQ LAROW
  580.           CMP #$8B       ;up arrow
  581.           BEQ UPAROW
  582.           CMP #$8A       ;down arrow
  583.           BEQ DNAROW
  584.           JSR CHBYTE     ;validate and change nibble
  585.  
  586.           JMP EDIT2      ;keep looping until ESC
  587.  
  588. ESC1      RTS            ;exit from editor
  589.  
  590. SPCBA     JSR SPCBAR     ;change position in byte
  591.           JMP EDIT2      ;loop back for another key
  592. RAROW     JSR RARROW     ;bump to next byte
  593.           JMP EDIT2      ;loop back for another key
  594. LAROW     JSR LARROW     ;bump back a byte
  595.           JMP EDIT2      ;loop back for another key
  596. UPAROW    JSR UPARROW    ;bump up 16 bytes
  597.           JMP EDIT2      ;loop back for another key
  598. DNAROW    JSR DNARROW    ;bump down 16 bytes
  599.           JMP EDIT2      ;loop back for another key
  600. EDHLP     JSR HELP       ;display help screen
  601.           JSR UPD_POS    ;update curs.pos.
  602.           JMP EDIT2      ;loop back for another key
  603.  
  604. * Validate and Change Nibble ---------------------------*
  605.  
  606. CHBYTE    CMP #$B0       ;'0'
  607.           BCC CB5        ;out of range maybe alpha
  608.           CMP #$BA       ;1 greater than ascii 9
  609.           BCS CB1        ;out of range maybe alpha
  610.           JSR DECI
  611.           RTS            ;return to caller
  612.  
  613. CB1       AND #$DF       ;mask to uppercase
  614.           CMP #$C1       ;'A'
  615.           BCC CB5        ;less than could be #
  616.           CMP #$C7       ;'G'
  617.           BCS CB5        ;out of range
  618.           JSR ALPHA      ;is alpha go process
  619.  
  620. CB5       RTS            ;return to caller
  621.  
  622. * Alpha Character --------------------------------------*
  623.  
  624. ALPHA     CLC
  625.           AND #$0F       ;mask off high nibble
  626.           ADC #$09       ;bring to hex equiv.
  627.           JMP ALL1
  628.  
  629. DECI      AND #$0F       ;mask off high nibble
  630.  
  631. ALL1      LDX BYTE_POS   ;nibble index
  632.           CPX #$01       ;low nibble
  633.           BEQ LOWNIB     ;is low nibble
  634.  
  635.           ASL            ;shift low to high nibble
  636.           ASL
  637.           ASL
  638.           ASL
  639. LOWNIB    STA TMP_BYTE   ;store result
  640.  
  641.           CPX #$00       ;high nibble
  642.           BEQ HN1        ;is high
  643.           DEC CUR_BYTE   ;current htab
  644.           DEC BYTE_POS   ;nibble index
  645.  
  646.           LDX BYTE_NO    ;get bufr.index
  647.           LDY PAGE       ;get page index
  648.           CPY #$00       ;page 1
  649.           BEQ BUFP1      ;is page 1
  650.           LDA BBUFF2,X   ;get byte from page 2
  651.           AND #$F0       ;mask off high nibble
  652.           JSR BFP        ;go update byte page 2
  653.           RTS            ;return to caller
  654.  
  655. BUFP1     LDA BBUFF,X    ;get byte from page 1
  656.           AND #$F0       ;mask off high nibble
  657.           JSR BFP1       ;go update byte page 1
  658.           RTS            ;return to caller
  659.  
  660. HN1       LDX BYTE_NO    ;get buffer index
  661.           LDY PAGE       ;get page index
  662.           CPY #$00       ;page 1
  663.           BEQ BUFP2      ;is page 1
  664.           LDA BBUFF2,X   ;get byte from page 2
  665.           AND #$0F       ;mask off low nibble
  666.  
  667. BFP       CLC
  668.           ADC TMP_BYTE   ;add change to byte
  669.           STA BBUFF2,X   ;store result
  670.           STA TEMPA2     ;new byte val.
  671.           JSR UPD_POS    ;update curs.pos.
  672.           JSR PHEX       ;hex.output
  673.  
  674.           JSR UPD_ASK    ;update ascii grid
  675.  
  676.           JSR UPD_POS    ;update curs.pos
  677.           RTS            ;return to caller
  678.  
  679. BUFP2     LDA BBUFF,X    ;get byte from page one
  680.           AND #$0F       ;mask off low nibble
  681.  
  682. BFP1      CLC
  683.           ADC TMP_BYTE   ;add change to byte
  684.           STA BBUFF,X    ;store result
  685.           STA TEMPA2     ;new byte val
  686.           JSR UPD_POS    ;update curs.pos.
  687.           JSR PHEX       ;hex.output
  688.  
  689.           JSR UPD_ASK    ;update ascii grid
  690.  
  691.           JSR UPD_POS    ;update curs.pos
  692.           RTS            ;return to caller
  693.  
  694. * Update ASCII Grid ------------------------------------*
  695.  
  696. UPD_ASK   LDY CUR_BYTE   ;current htab
  697.           STY HEX_POS    ;hex grid index
  698.           LDY ASK_POS    ;ascii index
  699.           STY CUR_BYTE   ;current htab
  700.           LDA TEMPA2     ;new byte val
  701.  
  702.           ORA #$80       ;set to high ascii
  703.           CMP #$A0       ;low ascii range
  704.           BCC OOR
  705.           CMP #$FF       ;upper ascii range
  706.           BCS OOR
  707.           JSR UPD_POS    ;update curs.pos.
  708.           JSR PCHAR      ;char.output
  709.           JMP UPD_D      ;cleanup for return
  710.  
  711. OOR       LDA #$AE       ;'.'
  712.           JSR UPD_POS    ;update curs.pos.
  713.           JSR PCHAR      ;char.output
  714.           JMP UPD_D      ;cleanup for return
  715.  
  716. UPD_D     LDY HEX_POS    ;get hex grid index
  717.           STY CUR_BYTE   ;current htab
  718.           LDA TEMPA2     ;new byte val
  719.           RTS            ;return to caller
  720.  
  721. * Move Up 16 Bytes -------------------------------------*
  722.  
  723. UPARROW   JSR CH_POS     ;chk to affirm high nibble
  724.           LDA CUR_LINE   ;get current vtab
  725.           CMP #$05       ;top limit
  726.           BEQ UP1
  727.           LDA BYTE_NO    ;bufr. index
  728.           SEC
  729.           SBC #$10       ;bump back 16 bytes
  730.           STA BYTE_NO    ;new bufr.index
  731.           DEC CUR_LINE   ;current vtab
  732.           JSR UPD_POS    ;update curs.pos.
  733.           RTS            ;return to caller
  734.  
  735. UP1       LDA #$14       ;set to bottom limit
  736.           STA CUR_LINE   ;current vtab
  737.           LDA BYTE_NO    ;bufr.index
  738.           CLC
  739.           ADC #$F0       ;bump by 240 bytes
  740.           STA BYTE_NO    ;bufr.index
  741.           JSR UPD_POS    ;update curs.pos.
  742.           RTS            ;return to caller
  743.  
  744. * Move Down 16 Bytes -----------------------------------*
  745.  
  746. DNARROW   JSR CH_POS     ;chk to affirm high nibble
  747.           LDA CUR_LINE   ;current vtab
  748.           CMP #$14       ;bottom limit
  749.           BEQ DN1
  750.           INC CUR_LINE   ;current vtab
  751.           LDA BYTE_NO    ;bufr.index
  752.           CLC
  753.           ADC #$10
  754.           STA BYTE_NO    ;bufr.index
  755.           JSR UPD_POS    ;update curs.pos.
  756.           RTS            ;return to caller
  757.  
  758. DN1       LDA #$05       ;set to top limit
  759.           STA CUR_LINE   ;current vtab
  760.           LDA BYTE_NO    ;bufr.index
  761.           SEC
  762.           SBC #$F0       ;bump down 240 bytes
  763.           STA BYTE_NO    ;bufr.index
  764.           JSR UPD_POS    ;update curs.pos.
  765.           RTS            ;return to caller
  766.  
  767. * High Nibble Validity Chk -----------------------------*
  768.  
  769. CH_POS    LDA BYTE_POS   ;nibble index
  770.           CMP #$00       ;0 = high
  771.           BEQ CH1
  772.           DEC CUR_BYTE   ;current htab
  773.           DEC BYTE_POS   ;nibble index
  774. CH1       RTS            ;return to caller
  775.  
  776. * Change Byte for Left Arrow ---------------------------*
  777.  
  778. LARROW    JSR CH_POS     ;chk to affirm high
  779.           LDA CUR_BYTE   ;current htab
  780.           CMP #$06
  781.           BEQ LA2
  782.           DEC BYTE_NO    ;bufr.index
  783.           DEC CUR_BYTE   ;current htab
  784.           DEC CUR_BYTE
  785.           DEC CUR_BYTE
  786.           DEC ASK_POS    ;ascii grid index
  787.           JSR UPD_POS    ;update curs.pos.
  788.           RTS            ;return to caller
  789.  
  790. LA2       LDA #$33
  791.           STA CUR_BYTE   ;current htab
  792.           LDA BYTE_NO    ;bufr.index
  793.           CLC
  794.           ADC #$0F       ;bump by 16 bytes
  795.           STA BYTE_NO    ;bufr.index
  796.           LDA #$48
  797.           STA ASK_POS    ;ascii grid index
  798.           JSR UPD_POS    ;update curs.pos.
  799.           RTS            ;return to caller
  800.  
  801. * Change Byte for Right Arrow --------------------------*
  802.  
  803. RARROW    JSR CH_POS     ;chk to affirm high
  804.           LDA CUR_BYTE   ;current htab
  805.           CMP #$33
  806.           BEQ RA2
  807.           INC BYTE_NO    ;bufr.index
  808.           INC CUR_BYTE   ;current htab
  809.           INC CUR_BYTE
  810.           INC CUR_BYTE
  811.           INC ASK_POS    ;ascii grid index
  812.           JSR UPD_POS    ;update curs.pos.
  813.           RTS            ;return to caller
  814.  
  815. RA2       LDA #$06
  816.           STA CUR_BYTE   ;current htab
  817.           LDA BYTE_NO    ;bufr.index
  818.           SEC
  819.           SBC #$0F       ;bump back 16 bytes
  820.           STA BYTE_NO    ;bufr.index
  821.           LDA #$39
  822.           STA ASK_POS    ;ascii grid index
  823.           JSR UPD_POS    ;update curs.pos.
  824.           RTS            ;return to edit2
  825.  
  826. * Change Position in Byte ------------------------------*
  827.  
  828. SPCBAR    LDA BYTE_POS   ;nibble index
  829.           CMP #$00       ;is it high nibble
  830.           BEQ HINIB
  831.           DEC CUR_BYTE   ;current htab
  832.           DEC BYTE_POS   ;nibble index
  833.           JSR UPD_POS    ;update curs.pos.
  834.           RTS            ;return to caller
  835.  
  836. HINIB     INC CUR_BYTE   ;current htab
  837.           INC BYTE_POS   ;nibble index
  838.           JSR UPD_POS    ;update curs.pos.
  839.           RTS            ;return to caller
  840.  
  841. * Update Cursor Position -------------------------------*
  842.  
  843. UPD_POS   STA TEMPA      ;save regs
  844.           LDA CUR_BYTE   ;current htab
  845.           STA HORIZ      ;set horiz.tab var
  846.           LDA CUR_LINE   ;current vtab
  847.           STA VERT       ;set vert.tab var.
  848.           JSR TAB        ;pos.curs.using horiz.vert
  849.           LDA TEMPA      ;restore regs.
  850.           RTS            ;return to caller
  851.  
  852. * Print Block ------------------------------------------*
  853.  
  854. PRNTT     LDA CSWL       ;output hooks low
  855.           STA CSWLS      ;save output hooks
  856.           LDA CSWH       ;output hooks high
  857.           STA CSWHS      ;save output hooks
  858.           LDA KSWL       ;input hooks low
  859.           STA KSWLS      ;save input hooks
  860.           LDA KSWH       ;input hooks high
  861.           STA KSWHS      ;save input hooks
  862.           LDA PAGE       ;get current page index
  863.           STA PAGE_TMP   ;store it
  864.  
  865.           LDA #$16
  866.           STA VERT       ;vert.tab var
  867.           LDA #$1D
  868.           STA HORIZ      ;horiz.tab var
  869.           JSR TAB        ;pos.curs.using vert.& horiz
  870.  
  871.           LDX #$00       ;set base pntr
  872. PRNT1     LDA PRNT_MSG,X ;string
  873.           JSR PCHAR      ;char.output
  874.           CPX #$16       ;string terminate
  875.           BEQ PRNT2
  876.           INX            ;bump pntr.
  877.           JMP PRNT1      ;get next char.
  878.  
  879. PRNT1A    JMP PRNT_1
  880.  
  881. PRNT2     JSR READ1      ;read keyboard
  882.           CMP #$9B       ;ESC
  883.           BEQ PRNT1A
  884.           AND #$DF       ;mask to uppercase
  885.           CMP #$CE       ;'N'
  886.           BEQ PRNT1A
  887.           CMP #$D9       ;'Y'
  888.           BEQ PRNT3
  889.           JMP PRNT2      ;get another key
  890.  
  891. PRNT3     JSR CLR1       ;clear message
  892.  
  893.           LDA #$01       ;outport to printer
  894.           JSR OUTPORT    ;set output hooks
  895.  
  896.           LDX #$00       ;set base pntr.
  897. BMSG      LDA STR2A,X    ;string
  898.           JSR PCHAR      ;char.output
  899.           INX            ;bump pntr.
  900.           CPX #$05       ;string terminate
  901.           BEQ BMSG1
  902.           JMP BMSG
  903.  
  904. BMSG1     LDA #$A0       ;space
  905.           JSR PCHAR      ;char.output
  906.           LDA #$A4       ;'$'
  907.           JSR PCHAR      ;char.output
  908.           LDA BLK_HIGH   ;high order byte of block
  909.           JSR PHEX       ;hex.output
  910.           LDA BLK_LOW    ;low order byte of block
  911.           JSR PHEX       ;hex.output
  912.           LDA #$8D       ;crlf.
  913.           JSR PCHAR      ;char.output
  914.  
  915.           LDA #$05
  916.           STA NUM        ;#of'='s for line
  917.           JSR LINE       ;print (======)
  918.  
  919.           LDX #$00       ;counter
  920. PR        LDA #$FC       ;'|'
  921.           JSR PCHAR      ;char.output
  922.           CPX #$10
  923.           BEQ PR1
  924.           TXA
  925.           JSR PHEX       ;hex.output
  926.           INX            ;bump counter
  927.           JMP PR         ;get next indx
  928.  
  929. PR1       LDA #$05
  930.           STA NUM        ;#of'='s for line
  931.           JSR LINE       ;print (======)
  932.  
  933.           LDX #$00       ;set base pntr.
  934. PR2       LDA STR2,X     ;string
  935.           JSR PCHAR      ;char.output
  936.           CPX #$0B
  937.           BEQ PR3
  938.           INX            ;bump pntr
  939.           JMP PR2        ;get next char.
  940.  
  941. PR3       LDA #$07
  942.           STA NUM        ;#of'='s for line
  943.           JSR LINE       ;print (======)
  944.  
  945.           LDA #$00       ;set page 1
  946.           STA PAGE       ;page index
  947.           LDA #$8D       ;crlf.
  948.           JSR PCHAR      ;char.output
  949.           LDA #$4E
  950.           STA NUM        ;#of'='s for line
  951.           JSR LINE       ;print (======)
  952.           LDA #$8D       ;crlf.
  953.           JSR PCHAR      ;char.output
  954.  
  955.           JSR OUTPRN     ;output to printer entry point
  956.  
  957.           LDA #$8D       ;crlf.
  958.           JSR PCHAR      ;char.output
  959.           LDA #$01       ;set page 2
  960.           STA PAGE       ;page index
  961.           JSR OUTPRN     ;output to printer entry point
  962.  
  963.           LDA #$8D       ;crlf.
  964.           JSR PCHAR      ;used to flush printer buff.
  965.  
  966.           LDA CSWLS      ;restore output hooks low
  967.           STA CSWL
  968.           LDA CSWHS      ;restore output hooks high
  969.           STA CSWH
  970.           LDA KSWLS      ;restore input hooks low
  971.           STA KSWL
  972.           LDA KSWHS      ;restore input hooks high
  973.           STA KSWH
  974.  
  975. PRNT_1    JSR CLR1       ;clear message
  976.           LDA PAGE_TMP   ;reset page index
  977.           STA PAGE       ;page index
  978.           RTS            ;return to caller
  979.  
  980. * Write Block ------------------------------------------*
  981.  
  982. RITE      LDA #$16
  983.           STA VERT       ;set vert.tab var.
  984.           LDA #$1C
  985.           STA HORIZ      ;set horiz.tab var.
  986.           JSR TAB        ;pos.curs.using vert.& horiz.
  987.  
  988.           LDY #$00       ;set base pntr.
  989. R         LDA VMSG1,Y    ;string
  990.           CMP #$00       ;string terminate
  991.           BEQ R1
  992.           JSR PCHAR      ;char.output
  993.           INY            ;bump pntr.
  994.           JMP R          ;get next char.
  995.  
  996. R1        JSR READ1      ;read keyboard
  997.           AND #$DF       ;mask to uppercase
  998.           CMP #$D9       ;'Y'
  999.           BEQ R2
  1000.           JSR CLR1       ;go clear message
  1001.           RTS            ;return to caller
  1002.  
  1003. R2        JSR CLR1       ;go clear message
  1004.           LDA #$81       ;write attribute
  1005.           STA R_W        ;read/write parameter
  1006.           JSR MLI_E      ;MLI entry point
  1007.           LDA #$80       ;read attribute
  1008.           STA R_W        ;read/write parameter
  1009.           RTS            ;return to caller
  1010.  
  1011. CLR1      LDA #$16
  1012.           STA VERT       ;set vert.tab var.
  1013.           LDA #$01
  1014.           STA HORIZ      ;set horiz.tab var.
  1015.           JSR TAB        ;pos.curs.using vert.& horiz.
  1016.           JSR CLEOL      ;clear to end of line
  1017.           RTS            ;return to caller
  1018.  
  1019. * Reset Base Block -------------------------------------*
  1020.  
  1021. RBAS      JSR DEVICE     ;get new base
  1022.           JSR DISP_BLK   ;disply block
  1023.           RTS            ;return to caller
  1024.  
  1025. * Last Block -------------------------------------------*
  1026.  
  1027. LSTBLK    LDA BLK_LOW    ;get low order byte of blk
  1028.           CMP #$00       ;if $00 then set blk_low to
  1029.           BEQ LB1        ;$FF and decrement blk_high
  1030.           DEC BLK_LOW
  1031.           JMP NBL        ;get block
  1032.  
  1033. LB1       LDA #$FF
  1034.           STA BLK_LOW    ;set low order
  1035.           DEC BLK_HIGH   ;set high order
  1036.           JMP NBL        ;get block
  1037.  
  1038. * Change Page ------------------------------------------*
  1039.  
  1040. CHPAGE    LDA PAGE       ;page index
  1041.           CMP #$00       ;page 1
  1042.           BEQ P2
  1043.           LDA #$00       ;set page 1
  1044.           STA PAGE       ;page index
  1045.           JSR DISP_BLK   ;display page
  1046.           RTS            ;return to caller
  1047.  
  1048. P2        LDA #$01       ;set page 2
  1049.           STA PAGE       ;page index
  1050.           JSR DISP_BLK   ;display page
  1051.           RTS            ;return to caller
  1052.  
  1053. * Get Next Block ---------------------------------------*
  1054.  
  1055. NBLKA     LDA BLK_LOW    ;get low order byte
  1056.           CMP #$FF       ;bump it by one
  1057.           BEQ NCHK       ;if $FF reset to $00
  1058.           INC BLK_LOW
  1059.           JMP NBL        ;get block
  1060.  
  1061. NCHK      LDA #$00       ;get high order byte
  1062.           STA BLK_LOW    ;bump it by one
  1063.           INC BLK_HIGH
  1064.           JMP NBL        ;get block
  1065.  
  1066. * Get Block From Disk ----------------------------------*
  1067.  
  1068. NBL       JSR MLI_E      ;get block from disk
  1069.           LDA #$00
  1070.           STA PAGE       ;reset page to 1
  1071.           JSR DISP_BLK   ;display block
  1072.           RTS            ;return to caller
  1073.  
  1074. * Print "="s Routine -----------------------------------*
  1075.  
  1076. LINE      LDY #$00       ;initialize counter
  1077.           LDA #$3D       ;char "="
  1078. L1        JSR PCHAR      ;char.ouput
  1079.           INY            ;bump counter
  1080.           CPY NUM        ;#of'='s to print
  1081.           BEQ RET1
  1082.           JMP L1         ;loop until cmplt
  1083. RET1      RTS            ;return to caller
  1084.  
  1085. * Get Device Info --------------------------------------*
  1086.  
  1087. INPUT1    CPY #$01
  1088.           BEQ DRV        ;get drive number
  1089.           CPY #$02
  1090.           BEQ SLT        ;get slot number
  1091.           JMP BLK        ;get block number
  1092.  
  1093. DRV       STY TEMPY      ;save 'Y' reg.
  1094.           JSR READ1      ;read keyboard
  1095.           CMP #$B1       ;'1'
  1096.           BCC DRVER      ;below range
  1097.           CMP #$B3       ;'3'
  1098.           BCS DRVER      ;above range
  1099.           LDY TEMPY      ;restore 'Y' reg.
  1100.           SBC #$AF       ;mask to hex equiv.
  1101.           CMP #$01       ;is it drive one
  1102.           BEQ SET1
  1103.           JSR PHEX       ;hex.output
  1104.           LDX #$80       ;setup dev_num Drive 2
  1105.           STX DEV_NUM
  1106.           RTS            ;return to caller
  1107.  
  1108.  
  1109. DRVER     PLA            ;error in input restore stack
  1110.           PLA
  1111.           JMP DEVICE     ;try again
  1112.  
  1113. SET1      JSR PHEX       ;hex.output
  1114.           LDX #$00       ;setup dev_num Drive 1
  1115.           STX DEV_NUM
  1116.           RTS            ;return to caller
  1117.  
  1118. SLT       STY TEMPY      ;save 'Y' reg.
  1119. DRVR      JSR READ1      ;read keyboard
  1120.           CMP #$9B       ;ESC
  1121.           BEQ DRVR
  1122.           CMP #$B0       ;'0'
  1123.           BCC DRVR       ;below range
  1124.           CMP #$B8       ;'8'
  1125.           BCS DRVR       ;above range
  1126.  
  1127.           LDY TEMPY      ;restore 'Y' reg.
  1128.           SBC #$AF       ;mask to hex equiv.
  1129.           JSR PHEX       ;hex.output
  1130.           ASL            ;shift in to slot pos.
  1131.           ASL
  1132.           ASL
  1133.           ASL
  1134.           CLC            ;clear carry
  1135.           ADC DEV_NUM    ;set up bit pattern for-
  1136.           STA DEV_NUM    ;-dev_num
  1137.           RTS            ;return to caller
  1138.  
  1139. BLKER     PLA            ;error in input restore stack
  1140.           PLA
  1141.           JMP DEVICE     ;try again
  1142.  
  1143. BLK       LDX #$00       ;initialize pointer
  1144. BLK1      JSR READ1      ;read keyboard
  1145.           CMP #$9B       ;ESC
  1146.           BEQ BLKER      ;ERROR in input
  1147.           CMP #$B0       ;less than 0
  1148.           BCC BLK2
  1149.           CMP #$BA       ;greater than 9
  1150.           BCS BLK3
  1151.           JSR PCHAR      ;char.output
  1152.           AND #$0F       ;mask off high nibble
  1153.           STA FIRST,X    ;store in place holders
  1154.           INX            ;bump pntr.
  1155.           CPX #$04       ;end input after the 4th char.
  1156.           BEQ BLKD
  1157. BLK2      JMP BLK1       ;loop until cmplt.
  1158.  
  1159. BLK3      AND #$DF       ;mask to uppercase
  1160.           CMP #$C1       ;less than 'A'
  1161.           BCC BLK2
  1162.           CMP #$C7       ;greater than 'F'
  1163.           BCS BLK2
  1164.           JSR PCHAR      ;char.output
  1165.           AND #$0F       ;mask off high nibble
  1166.           CLC
  1167.           ADC #$09       ;convert to hex equiv.
  1168.           STA FIRST,X    ;store in place holder
  1169.           INX            ;bump pntr.
  1170.           CPX #$04       ;end input after 4th char.
  1171.           BEQ BLKD
  1172.           JMP BLK1       ;loop until cmplt
  1173.  
  1174. BLKD      LDA FIRST      ;get first place holder
  1175.           ASL            ;shift to high nibble
  1176.           ASL
  1177.           ASL
  1178.           ASL
  1179.           CLC
  1180.           ADC SECOND     ;add to second place holder
  1181.           STA BLK_HIGH   ;high order byte of block
  1182.           LDA THIRD      ;get third place holder
  1183.           ASL            ;shift to high nibble
  1184.           ASL
  1185.           ASL
  1186.           ASL
  1187.           CLC
  1188.           ADC FOURTH     ;add to fourth place holder
  1189.           STA BLK_LOW    ;low order byte of block
  1190.           RTS            ;return to caller
  1191.  
  1192. * Set up for MLI Entry Point  -------------------------*
  1193.  
  1194. MLI_E     JSR MLI        ;MLI entry point
  1195. R_W       DB #$00        ;read/write parameter
  1196.           DA FCB         ;file control block
  1197.           BCS ERROR      ;error routine
  1198.           RTS            ;return to caller
  1199.  
  1200. * Error Routine for READ or WRITE ----------------------*
  1201.  
  1202. ERROR     STA TEMPA      ;save 'A' reg.
  1203.  
  1204.           LDA #$06
  1205.           STA HORIZ      ;horiz.tab var.
  1206.           STA VERT       ;vert.tab var.
  1207.           JSR TAB        ;pos.curs.using vert.& horiz.
  1208.           JSR HOME       ;clear screen
  1209.           LDA TEMPA      ;restore 'A' reg.
  1210.  
  1211.           CLC            ;clear error flag
  1212.           CMP #$28       ;NO DEVICE
  1213.           BEQ NO_DEV
  1214.  
  1215.           LDX #$00       ;base pntr.
  1216. E1        LDA ERR_MSG1,X ;string
  1217.           CMP #$00       ;string terminate
  1218.           BEQ E2A
  1219.           JSR PCHAR      ;char.output
  1220.           INX            ;bump pntr.
  1221.           JMP E1         ;get next char.
  1222.  
  1223. E2A       LDX #$00       ;base pntr.
  1224. E2AA      LDA TRY_MSG,X  ;string
  1225.           CMP #$00       ;string terminate
  1226.           BEQ E2B
  1227.           JSR PCHAR      ;char.output
  1228.           INX            ;bump pntr.
  1229.           JMP E2AA       ;get next char.
  1230.  
  1231. E2B       JSR READ1      ;read keyboard
  1232.           CMP #$9B       ;'ESC'
  1233.           BEQ E2C
  1234.           AND #$DF       ;mask to uppercase
  1235.           CMP #$D9       ;'Y'
  1236.           BEQ E2C
  1237.           CMP #$CE       ;'N'
  1238.           BEQ OUT
  1239.           JMP E2B        ;get another key
  1240.  
  1241. OUT       JSR QT         ;if NO exit program
  1242. E2C       JMP DEVICE     ;get new input
  1243.  
  1244. NO_DEV    LDX #$00       ;set base pntr.
  1245. E3        LDA ERR_MSG2,X ;string
  1246.           CMP #$00       ;string terminate
  1247.           BEQ E4
  1248.           JSR PCHAR      ;char.output
  1249.           INX            ;bump pntr.
  1250.           JMP E3         ;get next char.
  1251. E4        JMP E2A        ;try again
  1252.  
  1253. * Quit Routine -----------------------------------------*
  1254.  
  1255. QT        LDA #$16
  1256.           STA VERT       ;vert.tab var.
  1257.           LDA #$1C
  1258.           STA HORIZ      ;horiz.tab var.
  1259.           JSR TAB        ;pos.curs.using vert.& horiz.
  1260.  
  1261.           LDX #$00       ;set base pntr.
  1262. QT1       LDA QT_MSG,X   ;string
  1263.           CMP #$00       ;string terminate
  1264.           BEQ QT2
  1265.           JSR PCHAR      ;char.output
  1266.           INX            ;bump pntr.
  1267.           JMP QT1        ;get next char.
  1268.  
  1269. QT2       JSR READ1      ;read keyboard
  1270.           CMP #$9B       ;'ESC'
  1271.           BEQ QT3
  1272.           AND #$DF       ;mask to uppercase
  1273.           CMP #$D9       ;'Y'
  1274.           BEQ QT4
  1275.           CMP #$CE       ;'N'
  1276.           BEQ QT3
  1277.           JMP QT2        ;must be 'Y','N','ESC'
  1278.  
  1279. QT3       JSR CLR1       ;clear message
  1280.           RTS            ;return to caller
  1281.  
  1282. QT4       PLA            ;restore stack
  1283.           PLA
  1284.  
  1285.  
  1286. QUIT      LDA #$00       ;open entire screen
  1287.           STA TOP        ;top margin
  1288.           LDA #$17
  1289.           STA BOTTOM     ;bottom margin
  1290.           LDA #$50
  1291.           STA RIGHT      ;right margin
  1292.           JSR HOME       ;clear screen
  1293.           JMP BASIC      ;return to basic prompt
  1294.  
  1295.  
  1296. * Display Block Routine --------------------------------*
  1297.  
  1298. DISP_BLK  LDA #$50
  1299.           STA RIGHT      ;right margin
  1300.  
  1301.           LDA #$05
  1302.           STA VERT       ;vert.tab var.
  1303.           LDA #$4B
  1304.           STA HORIZ      ;horiz.tab var.
  1305.           JSR TAB        ;pos.curs.using vert.& horiz.
  1306.           LDA #$A4       ;'$'
  1307.           JSR PCHAR      ;char.output
  1308.           LDA BLK_HIGH   ;high order byte of block
  1309.           JSR PHEX       ;hex.output
  1310.           LDA BLK_LOW    ;low order byte of block
  1311.           JSR PHEX       ;hex.output
  1312.           LDA #$4B
  1313.           STA RIGHT      ;right margin
  1314.  
  1315.           LDA #$06
  1316.           STA VERT       ;vert.tab var.
  1317.           LDA #$00
  1318.           STA HORIZ      ;horiz.tab var.
  1319.           JSR TAB        ;pos.curs.using vert.& horiz.
  1320.  
  1321.           JSR HOME       ;clear screen
  1322. OUTPRN    LDA #$0F
  1323.           STA EBASE      ;line end..base pntr
  1324.           LDX #$00       ;pointer
  1325.           LDY #$00       ;pointer
  1326.  
  1327. DIS1      LDA PAGE       ;either $00 or $01
  1328.           JSR PHEX       ;hex.output
  1329.           TYA            ;line number
  1330.           JSR PHEX       ;hex.ouput
  1331.           LDA #$7C       ;'|'
  1332.           JSR PCHAR      ;char.output
  1333.           LDA #$3E       ;'>'
  1334.           JSR PCHAR      ;char.output
  1335.  
  1336. DIS2      LDA PAGE       ;
  1337.           CMP #$00       ;page 1
  1338.           BEQ DIS2A      ;is page 1
  1339.           LDA BBUFF2,X   ;get byte from page 2
  1340.           JMP DIS2B
  1341.  
  1342. DIS2A     LDA BBUFF,X    ;get byte from page 1
  1343. DIS2B     JSR PHEX       ;hex.ouput
  1344.           LDA #$A0       ;space
  1345.           CPX EBASE      ;line end..base pntr.
  1346.           BEQ DIS3
  1347.  
  1348.           JSR PCHAR      ;char.output
  1349.  
  1350.           INX            ;bump index
  1351.           JMP DIS2       ;get next byte
  1352.  
  1353. DIS3      STX BPNTR      ;base pntr for new line
  1354.           LDA #$7C       ;'|'
  1355.           JSR PCHAR      ;char.output
  1356.           LDA #$A0       ;space
  1357.           JSR PCHAR      ;char.output
  1358.           JSR PCHAR
  1359.           LDA #$7C       ;'|'
  1360.           JSR PCHAR
  1361.  
  1362.           TXA            ;reset byte counter to 1st
  1363.           SEC            ;byte in line and print
  1364.           SBC #$0F       ;corresponding ascii
  1365.           TAX
  1366.  
  1367. DIS4      LDA PAGE       ;page index
  1368.           CMP #$00       ;page 1
  1369.           BEQ DIS4A      ;is page 1
  1370.           LDA BBUFF2,X   ;get byte from page 2
  1371.           JMP DIS4B
  1372.  
  1373. DIS4A     LDA BBUFF,X    ;get byte from page 1
  1374. DIS4B     CMP #$21       ;low range ascii
  1375.           BCC PERIOD     ;out of range go print '.'
  1376.           CMP #$7F       ;high range ascii
  1377.           BCS PERIOD     ;out of range go print '.'
  1378.           JMP DIS5
  1379.  
  1380. PERIOD    LDA #$AE       ;'.'
  1381.           JSR PCHAR      ;char.output
  1382.           CPX BPNTR      ;base pointer < EOL
  1383.           BEQ DIS6       ;is last char in line
  1384.           INX            ;bump index
  1385.           JMP DIS4       ;get next byte
  1386.  
  1387. DIS5      ORA #$80       ;flip to high ascii
  1388.           JSR PCHAR      ;char.output
  1389.           CPX BPNTR      ;base pointer < EOL
  1390.           BEQ DIS6       ;is last char in line
  1391.           INX            ;bump index
  1392.           JMP DIS4       ;get next byte
  1393.  
  1394. DIS6      LDX BPNTR      ;base pointer line begin
  1395.           CPX #$FF       ;end of page
  1396.           BEQ DIS7
  1397.  
  1398.           LDA #$7C       ;'|'
  1399.           JSR PCHAR      ;char.output
  1400.           LDA #$8D       ;crlf
  1401.           JSR PCHAR      ;char.output
  1402.  
  1403.           TYA
  1404.           ADC #$10       ;bump line #
  1405.           TAY
  1406.           INX
  1407.           TXA
  1408.           ADC #$0F       ;bump by 16
  1409.           STA EBASE      ;line end..base pntr.
  1410.           JMP DIS1       ;loop next line
  1411.  
  1412. DIS7      LDA #$7C       ;'|'
  1413.           JSR PCHAR      ;char.output
  1414.  
  1415.           RTS            ;return to caller
  1416.  
  1417. *-------------------------------------------------------*
  1418.  
  1419.           END
  1420.